package jinzhi1.binary.binary.lib;

import java.util.HashMap;

//16进制
public class Hex extends Binary {
private String hex;
public Hex(String hex) {
        this.hex=hex;
    }


        /*
  函数：16进制转换二进制
      原理：
       1. 将16进制数字分成一个一组,字符换成对应的数字
       2. 对每一组数字进行转换二进制4个数字
       3.将转换后的结果连接起来
        (11)
        1--0001   1--0001
        二进制为: 000010001
     */

    @Override
   public String toBin() {
        String bin = "";
        long dec = 0;
        //定义一个数组A~F的字符保存在里面
        String[] c ={"A","B","C","D","E","F"};
        //创建一个MAP
        HashMap<String,Integer> hashMap = new HashMap<>();
        //0~9 保存在MAp里面
        for (int i = 0; i <= 9; i++) {
            hashMap.put(i+"",i);
        }
        //10~15 保存在MAp里面 key是 A~F
        for (int j = 10; j <=15; j++) {
            hashMap.put(c[j-10],j );
        }
        //获取的16进制数字一个一个的保存在数组里面
        String[] st =new String[hex.length()];
        for (int g = 0; g < hex.length(); g++) {
            st[g] = hex.substring(g,g+1);
        }
        // 使用数组st为key获取MAP对应的数字，进行进制转换
        StringBuilder str = new StringBuilder();
        String d = "";
        for (int i = 0; i < st.length; i++) {
            int s2 = hashMap.get(st[i]);
            if (s2 <8) {
                String[] oct = {"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111"};
                str.append( oct[s2]);
                bin = bin+str.toString();
            }else {
                // 循环判断余数
                while (s2 > 0) {
                    str.append(s2 % 2);
                    s2 /= 2;
                }
               bin = bin+str.reverse().toString();
            }
            // 清空 StringBuilder
            str.setLength(0);
        }
        return bin;
    }
    /*
  函数：16进制转换10进制
    转换原理：
      1.字符替换成对应的数字
   */
    @Override
    public long toDec() {
        long dec = 0;
        //定义一个数组A~F的字符保存在里面
        String[] c ={"A","B","C","D","E","F"};
        //创建一个MAP
        HashMap<String,Integer> hashMap = new HashMap<>();
        //0~9 保存在MAp里面
        for (int i = 0; i <= 9; i++) {
            hashMap.put(i+"",i);
        }
        //10~15 保存在MAp里面 key是 A~F
        for (int j = 10; j <=15; j++) {
            hashMap.put(c[j-10],j );
        }
        //获取的16进制数字一个一个的保存在数组里面
       String[] st =new String[hex.length()];
        for (int g = 0; g < hex.length(); g++) {
            st[g] = hex.substring(g,g+1);
        }
        // 使用数组st为key获取MAP对应的数字，进行进制转换
        for (int h = 0; h < st.length; h++) {
            dec += hashMap.get(st[h])*pingFang(16, st.length-h-1);
        }
        return dec;
    }
    /*
函数：16进制转换八进制
    原理：
     1.16进制转换成 10进制或二进制;
     2. 10进制 每一个数字进行转换二进制3个数字
     3.将转换后的结果连接起来
      F (15)
      15/8=1......7;
      八进制为: (17)
   */
    @Override
    public long toOct() {
        long oct = 0;
        long dec = 0;
        //定义一个数组A~F的字符保存在里面
        String[] c ={"A","B","C","D","E","F"};
        //创建一个MAP
        HashMap<String,Integer> hashMap = new HashMap<>();
        //0~9 保存在MAp里面
        for (int i = 0; i <= 9; i++) {
            hashMap.put(i+"",i);
        }
        //10~15 保存在MAp里面 key是 A~F
        for (int j = 10; j <=15; j++) {
            hashMap.put(c[j-10],j );
        }
        //获取的16进制数字一个一个的保存在数组里面
        String[] st =new String[hex.length()];
        for (int g = 0; g < hex.length(); g++) {
            st[g] = hex.substring(g,g+1);
        }
        // 使用数组st为key获取MAP对应的数字，进行进制转换
        for (int h = 0; h < st.length; h++) {
            dec += hashMap.get(st[h])*pingFang(16, st.length-h-1);
        }
        int power = 1;
        // 处理十进制值
        while (dec > 0) {
            oct += (dec % 8) * power; // 添加当前位(余数)到八进制
            dec /= 8; // 删除已处理的位
            power *= 10; // 为下一位增加 10 的幂(八进制使用基数 8)
        }
        return oct;
    }

    /*
函数：16进制转换16进制
转换原理：
  16进制等于16进制
*/
    @Override
    String toHex() {
        return hex;
    }
    public long pingFang(long num,int p){
        long result = 1;
        for (int i = 0; i < p; i++) {
            result = result*num;
        }
        return result;
    }
}
